from rest_framework import serializers
from django.contrib.auth import get_user_model
import re
from MxsShop.settings import mobile_regex
from datetime import datetime, timedelta
from apps.users.models import VerifyCode
from rest_framework.validators import UniqueValidator

User = get_user_model()


class SmsSerializers(serializers.Serializer):
    """
    验证手机号码
    """
    mobile = serializers.CharField(max_length=11,help_text='手机号码')

    def validate_mobile(self, mobile):
        """
        验证手机号码
        """
        # 手机是否注册
        if User.objects.filter(mobile=mobile).count():
            raise serializers.ValidationError('用户已经存在')

        # 手机号码是否合法
        if not re.match(mobile_regex, mobile):
            raise serializers.ValidationError('手机号码非法')

        # 验证发送频率
        one_min_age = datetime.now() - timedelta(hours=0, minutes=1, seconds=0)
        if VerifyCode.objects.filter(add_time__gt=one_min_age, mobile=mobile):
            raise serializers.ValidationError('距离上一次发送时间未超过60s')
        return mobile


class UserDetailSerializer(serializers.ModelSerializer):
    """用户详情"""

    class Meta:
        model = User
        fields = ("name", "gender", 'email', 'mobile', "birthday")


class UserRegSerializer(serializers.ModelSerializer):
    code = serializers.CharField(required=True, max_length=4, min_length=4, help_text='验证码', label='验证码',
                                 write_only=True,
                                 error_messages={
                                     'blank': '请输入验证码',
                                     'required': '请输入验证码',
                                     'max_length': '验证码格式错误',
                                     'min_length': '验证码格式错误'
                                 })
    username = serializers.CharField(required=True, allow_blank=False, label='用户名',
                                     validators=[UniqueValidator(queryset=User.objects.all(), message='用户已存在')])
    password = serializers.CharField(label='密码', write_only=True, style={"input_type": 'password'})

    # def create(self, validated_data):
    #     user = super(UserRegSerializer, self).create(validated_data=validated_data)
    #     user.set_passwrod(validated_data['password'])
    #     user.save()
    #     return user

    def validate_code(self, code):
        verify_records = VerifyCode.objects.filter(mobile=self.initial_data['username']).order_by('-add_time')
        if verify_records:
            last_record = verify_records[0]
            five_min_age = datetime.now() - timedelta(hours=0, minutes=5, seconds=0)
            if five_min_age > last_record.add_time:
                raise serializers.ValidationError("验证码过期")
            if last_record.code != code:
                raise serializers.ValidationError('验证码错误')
        else:
            raise serializers.ValidationError('验证码错误')

    def validate(self, attrs):
        attrs['mobile'] = attrs['username']
        del attrs['code']
        return attrs

    class Meta:
        model = User
        fields = ("username", "code", "mobile", 'password')
